package course;

import Management.ExcelUtil;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**开始excel操作
 * 工作薄
 * 获个sheet页
 * 读取数据
 * 获取第零个单元格
 * 获取第一个单元格
 * 获取第二个单元格
 * 获取第三个单元格
 * 获取第四单元格
 * 所用的set方法床
 * 文件和  内存wb绑定
 * 关闭
 * public class是JAVA定义的
 * 一般占到编程的角度来将就是包含main方法的，
 * 一个java文件中。
 * Java是一门面向对象编程语言
 * 不仅吸收了C++语言的各种优点
 * 还摒弃了C++里难以理解的多继承、指针等概念
 * 因此Java语言具有功能强大和简单易用两个特征
 * Java语言作为静态面向对象编程语言的代表
 * 极好地实现了面向对象理论
 * 允许程序员以优雅的思维方式进行复杂的编程。
 * 扩展资料：
 * Java看起来设计得很像C++
 * 但是为了使语言小和容易熟悉
 * 设计者们把C++语言中许多可用的特征去掉了
 * 这些特征是一般程序员很少使用的
 * 例如，Java不支持go to语句
 * 代之以提供break和continue语句以及异常处理
 * Java还剔除了C++的操作符过载（overload）和多继承特征
 * 并且不使用主文件，免去了预处理程序。
 * 因为Java没有结构
 * 数组和串都是对象
 * 所以不需要指针
 * Java能够自动处理对象的引用和间接引用
 * 实现自动的无用单元收集
 * 使用户不必为存储管理问题烦恼
 * 能更多的时间和精力花在研发上
 */

public class CourseExcel {
        public ArrayList<CoursePojo> readCourseInfo(File file) {
        {
            // 开始excel操作
            ArrayList<CoursePojo> slist = new ArrayList<>();
            // 工作薄
            XSSFWorkbook wb = null;
            //查询是否为空
            try {
                //尝试
                wb = new XSSFWorkbook(file);
                // 获个sheet页
                XSSFSheet sheet1 = wb.getSheetAt(0);
                //读取数据

                for (int i = 1; i <= sheet1.getLastRowNum(); i++)
                /**
                 * for循环是编程语言中一种循环语句
                 * 而循环语句由循环体及循环的判定条件两部分组成
                 * 其表达式为：for（单次表达式;条件表达式;末尾循环体）
                 * {中间循环体；}
                 * for循环小括号里第一个“;”号前为一个为不参与循环的单次表达式
                 * 其可作为某一变量的初始化赋值语句, 用来给循环控制变量赋初值
                 * 也可用来计算其它与for循环无关但先于循环部分处理的一个表达式。
                 * “;”号之间的条件表达式是一个关系表达式，其为循环的正式开端
                 * 当条件表达式成立时执行中间循环体。
                 * 执行的中间循环体可以为一个语句
                 * 也可以为多个语句
                 * 当中间循环体只有一个语句时
                 * 其大括号{}可以省略
                 * 执行完中间循环体后接着执行末尾循环体
                 */
                {
                    // 获取单元格
                    XSSFRow row = sheet1.getRow(i);
                    XSSFCell cell1 = row.getCell(0);
                    //获取第零个单元格
                    XSSFCell cell2 = row.getCell(1);
                    //获取第一个单元格
                    XSSFCell cell3 = row.getCell(2);
                    //获取第二个单元格
                    XSSFCell cell4 = row.getCell(3);
                    //获取第三个单元格

//                                                            System.out.println(cell1.getStringCellValue());
//                                                            System.out.println(cell2.getStringCellValue());
                    CoursePojo pojo = new CoursePojo();
 //                   pojo.setCon(cell1.getStringCellValue().toString());
                    pojo.setCno(ExcelUtil.getStringCellValue(cell1));
                    //所用的set方法
                    pojo.setCname(cell2.getStringCellValue().toString());
                    //创建属性
                    pojo.setCgrade((int) cell3.getNumericCellValue());
                    //创建属性
                    pojo.setCtime((int) cell4.getNumericCellValue());
                    //创建属性


//                    System.out.println(ExcelUtil.getStringCellValue(cell5));


                    slist.add(pojo);
                    //添加
                }

                wb.close();
                //关闭
            } catch (IOException e) {
                e.printStackTrace();
                //初始化
            } catch (InvalidFormatException e) {
                //抓住数据
                e.printStackTrace();
                //使用
            }

            return slist;
            //返回
        }
    }

    /**新建
     * 工作簿
     * 获取第一个sheet页
     * 组装表头
     * 有课程号
     * 课程名
     * 学时
     * 成绩
     * 组装表主体
     * 获取单元格
     * 文件和  内存wb绑定
     * @param filepath
     * @param slist
     * @throws IOException
     */
    public void exportto(String filepath, List<CoursePojo> slist) throws IOException
    /**

     * 包名采用域后缀倒置的加上自定义的包名，
     * 采用小写字母。
     * 包名使用产品的名称加上模块的名称。
     * com.ruen.产品名.模块名称
     * 体检报告action类 import com.ruen.health.action.ExamReportAction;
     * 用户信息实体类 import com.ruen.health.bean.UserInfo;
     * 类名和接口使用类意义完整的英文描述
     * 每个英文单词的首字母使用大写、其余字母使用小写的大小写混合法
     * OrderInformation, CustomerList, LogManager, LogConfig
     * 方法名使用类意义完整的英文描述
     * 第一个单词的字母使用小写、剩余单词首字母大写其余字母小写的大小写混合法。
     * private void calculateRate();
     * public void addNewOrder();
     * 属性名使用意义完整的英文描述
     * 第一个单词的字母使用小写、剩余单词首字母大写其余字母小写的大小写混合法
     * 属性名不能与方法名相同。
     * private customerName;
     * private orderNumber;
     * private smpSession;
     * 常量名使用全大写的英文描述
     * 英文单词之间用下划线分隔开
     * 并且使用 final static 修饰
     */
    {

        File file = new File(filepath);
        //新建
        FileOutputStream out = new FileOutputStream(file);
        // 工作薄
        XSSFWorkbook wb = null;
        //为空
        wb = new XSSFWorkbook();
        // 获取第一个sheet页
        XSSFSheet sheet1 = wb.createSheet("课程表");

        // 组装表头
        /**有课程号
         * 课程名
         * 成绩
         * 学时
         */
        XSSFRow row = sheet1.createRow(0);
        XSSFCell cell1 = row.createCell(0);
        XSSFCell cell2 = row.createCell(1);
        XSSFCell cell3 = row.createCell(2);
        XSSFCell cell4 = row.createCell(3);
        cell1.setCellValue("课程号");
        //课程号
        cell2.setCellValue("课程名");
        //课程名
        cell3.setCellValue("成绩");
        //成绩
        cell4.setCellValue("学时");
        //学时


        // 组装表主体
        for (int i = 0; i < slist.size(); i++)
        /**
         *for循环是编程语言中一种循环语句
         * 而循环语句由循环体及循环的判定条件两部分组成
         * 其表达式为：for（单次表达式;条件表达式
         * 末尾循环体）
         * {中间循环体；}
         * for循环小括号里第一个“;”号前为一个为不参与循环的单次表达式
         * 其可作为某一变量的初始化赋值语句
         * 用来给循环控制变量赋初值；
         * 也可用来计算其它与for循环无关但先于循环部分处理的一个表达式。
         * “;”号之间的条件表达式是一个关系表达式，其为循环的正式开端
         * 当条件表达式成立时执行中间循环体。
         * 执行的中间循环体可以为一个语句
         * 也可以为多个语句，当中间循环体只有一个语句时，其大括号{}可以省略
         * 执行完中间循环体后接着执行末尾循环体。
         */
        {
            CoursePojo item = slist.get(i);

            XSSFRow newrow = sheet1.createRow(i + 1);
            XSSFCell newcell1 = newrow.createCell(0);
            //组装0
            XSSFCell newcell2 = newrow.createCell(1);
            //组装1
            XSSFCell newcell3 = newrow.createCell(2);
            //组装2
            XSSFCell newcell4 = newrow.createCell(3);
            //组装3

            newcell1.setCellValue(item.getCno());
            //获取第一个单元格
            newcell2.setCellValue(item.getCname());
            //获取第二个单元格
            newcell3.setCellValue(item.getCgrade());
            //获取第三个单元格
            newcell4.setCellValue(item.getCtime());
            //获取第四个单元格
        }
        // 获取单元格


        wb.write(out);
        // 文件和  内存wb绑定
        out.close();
        //关闭
        wb.close();
        //关闭
    }
}
